package gestorvideoclub.jdbc;

import gestorvideoclub.Pedido;
import gestorvideoclub.Producto;
import gestorvideoclub.enumeraciones.*;
import gestorvideoclub.util.UtilFecha;
import java.sql.*;
import java.util.ArrayList;
import java.util.Collection;

/**
 *
 * @author MIGUEL_MAESTRE
 */
public class PedidoJDBC {

    /**
     * Registro de un nuevo pedido en la BBDD
     * 
     * @param ped Objeto Pedido
     */
    public static void insertarPedido(Pedido ped) {
        int codProd = -1;

        String sql = "";

        Connection con = null;
        try {
            con = AccesoDatos.getConexion();
            Statement st = con.createStatement();

            for (Producto prod : ped.getProductos()) {
                codProd = prod.getId();

                sql = "insert into pedidos (id_proveedor, fechaPedido, numeroPedido, estadoPedido, id_producto) values ('";
                sql += ped.getProveedor().getIdProveedor();
                sql += "', '";
                sql += UtilFecha.fechaMySQL(ped.getFechaPedido());
                sql += "', ";
                sql += ped.getNumeroPedido();
                sql += ", '";
                sql += ped.getEstado();
                sql += "', ";
                sql += codProd;
                sql += ")";

                st.executeUpdate(sql);
            }

            st.close();
            AccesoDatos.cerrarConexion(con);
            System.out.println("[i] El pedido se ha registrado correctamente.");
        } catch (SQLException e) {
            System.out.println("[!] Error al realizar el pedido. " + e.getMessage());
        }
    }

    /**
     * Obtiene un objeto Pedido de la BBDD
     *
     * @param codPedido Código del pedido
     * @return Objeto Pedido
     */
    public static Pedido obtenerPedidoPorCodigo(int codPedido) {
        Pedido p = new Pedido();
        Collection<Producto> productos = new ArrayList();
        TipoProductoEnum tipoProducto;

        String sql = "select id_proveedor, fechaPedido, numeroPedido, estadoPedido, id_producto from pedidos where numeroPedido=" + codPedido;
        String estado = "";

        Connection con = null;
        try {
            con = AccesoDatos.getConexion();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);

            rs.next(); 

            p.setFechaPedido(rs.getTime("pedidos.fechaPedido"));        // Seteo fecha pedido
            p.setNumeroPedido(rs.getInt("pedidos.numeroPedido"));       // Seteo número pedido
            estado = rs.getString("pedidos.estadoPedido");              // Seteo estado pedido
            if (estado.equals("Recibido")) {                            
                p.setEstado(EstadoPedido.Recibido);
            } else if (estado.equals("Pendiente")) {
                p.setEstado(EstadoPedido.Pendiente);
            }
            p.setProveedor(ProveedorJDBC.obtenerProveedorPorId(rs.getInt("pedidos.id_proveedor"))); // Seteo proveedor

            do {                                                                                    // Seteo lista productos
                tipoProducto = ProductoJDBC.obtenerTipoProductoPorId(rs.getInt("pedidos.id_producto"));
                if (tipoProducto == TipoProductoEnum.BlueRay || tipoProducto == TipoProductoEnum.DVD) {
                    productos.add(PeliculaJDBC.obtenerPeliculaPorId(rs.getInt("pedidos.id_producto")));
                    System.out.println(PeliculaJDBC.obtenerPeliculaPorId(1234));
                }
                if (tipoProducto == TipoProductoEnum.Videojuego) {
                    productos.add(VideojuegoJDBC.obtenerVideojuegoPorId(rs.getInt("pedidos.id_producto")));
                }
            } while (rs.next());

        } catch (Exception e) {
            System.out.println("[!] Error al obtener el pedido. " + e.getMessage());
        }
        return p;
    }

    /**
     * Comprobar si un pedido existe en la BBDD
     *
     * @param codPedido Código del pedido
     * @return true si existe el pedido, false en caso contrario
     */
    public static boolean existePedido(int codPedido) {
        boolean existe = false;
        String sql = "select Id from pedidos where numeroPedido='" + codPedido + "'";
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;
        try {
            con = AccesoDatos.getConexion();
            st = con.createStatement();
            rs = st.executeQuery(sql);

            if (rs.next()) {
                existe = true;
            }
        } catch (Exception e) {
            System.out.println("[!] Error al comprobar si el pedido existe. " + e.getMessage());
        } finally {
            AccesoDatos.cerrarConexion(con);
        }
        return existe;
    }

    /**
     * Generación automática del código de pedido
     * 
     * @return Devuelve código de pedido 
     */
    public static int siguienteCodigo() {
        int codigo = -1;
        String sql = "SELECT max(numeroPedido) as maximo FROM pedidos";

        Connection con = null;
        Statement st = null;
        ResultSet rs = null;
        try {
            con = AccesoDatos.getConexion();
            st = con.createStatement();
            rs = st.executeQuery(sql);

            rs.next();
            codigo = rs.getInt("maximo") + 1;
        } catch (Exception e) {
            System.out.println("[!] Error al comprobar si el pedido existe. " + e.getMessage());
        } finally {
            AccesoDatos.cerrarConexion(con);
        }
        return codigo;
    }

    /**
     * Actualización del estado del pedido y de los productos asociados
     * 
     * @param ped Objeto Pedido
     */
    public static void actualizaPedido(Pedido ped) {
        int numPedido = ped.getNumeroPedido();
        String sqlActEstado = "UPDATE pedidos SET estadoPedido='Recibido' WHERE numeroPedido='" + numPedido + "'";

        Connection con = null;
        Statement st = null;
        ResultSet rs = null;

        // Actualizo estado del pedido
        try {
            con = AccesoDatos.getConexion();
            st = con.createStatement();

            if (ped.getEstado().toString().equals("Recibido")) {
                st.executeUpdate(sqlActEstado);
            }
        } catch (Exception e) {
            System.out.println("[!] Error al actualizar el estado del pedido. " + e.getMessage());
        } finally {
            AccesoDatos.cerrarConexion(con);
        }

        // Actualizo estado de los productos
        for (Producto p : ped.getProductos()) { // Recorrer la lista de productos
            if (p.getEstado() == ProductoEnum.Disponible) {
                ProductoJDBC.modificarProducto(p);
            }
        }
    }
}
